package cn.stylefeng.guns.cloud.workflow.modular.service;

import cn.stylefeng.guns.cloud.model.page.PageResult;
import cn.stylefeng.guns.cloud.system.api.model.UserInfo;
import cn.stylefeng.guns.cloud.system.api.model.WorkflowRoleInfo;
import cn.stylefeng.guns.cloud.workflow.api.entity.ActBaseEntity;
import cn.stylefeng.guns.cloud.workflow.api.model.result.ActBaseResult;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;

import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * 流程基础 服务接口
 *
 * @Author xuyuxiang
 * @Date 2019/11/18 11:09
 **/
public interface ActBaseService {

    /**
     * 开启流程
     *
     * @Author xuyuxiang
     * @Date 2019/11/18 17:43
     **/
    void start(String processDefinitionKey, Long businessId, ActBaseEntity entity, Map paramMap);

    /**
     * 驳回后修改内容重新申请
     *
     * @Author xuyuxiang
     * @Date 2019/11/18 17:44
     **/
    void reStart(ActBaseEntity entity);

    /**
     * 驳回后取消申请
     *
     * @Author xuyuxiang
     * @Date 2019/11/18 17:44
     **/
    void cancel(ActBaseEntity entity);

    /**
     * （列表）填充业务实体返回结果工作流相关字段，用于展示申请的状态信息
     *
     * @Param entityList :继承自ActBaseEntity的实体
     * @Author xuyuxiang
     * @Date 2019/11/17 22:57
     **/
    void fillEntityList(List<ActBaseEntity> entityList);

    /**
     * （列表）填充结果集工作流相关字段，用于展示申请的状态信息
     *
     * @Param resultList :继承自ActBaseResult的结果集model
     * @Author xuyuxiang
     * @Date 2019/11/17 22:57
     **/
    void fillResultList(List<ActBaseResult> resultList);

    /**
     * （分页）填充业务实体返回结果工作流相关字段，用于展示申请的状态信息
     *
     * @Param pageResult:继承自ActBaseEntity的分页对象
     * @Author xuyuxiang
     * @Date 2019/11/17 22:57
     **/
    void fillEntityPage(PageResult pageResult);

    /**
     * （分页）填充结果集工作流相关字段，用于展示申请的状态信息
     *
     * @Param pageResult:继承自ActBaseResult的分页对象
     * @Author xuyuxiang
     * @Date 2019/11/17 22:57
     **/
    void fillResultPage(PageResult pageResult);

    /**
     * 根据用户id（Long)获取用户名，远程调用system接口
     *
     * @Author xuyuxiang
     * @Date 2019/11/19 14:29
     **/
    String getNameByUserId(Long userId);

    /**
     * 根据用户id（String)获取用户名，远程调用system接口
     * 方便用户id为String类型的其他方法调用
     *
     * @Author xuyuxiang
     * @Date 2019/11/19 14:29
     **/
    String getNameByUserId(String userId);

    /**
     * 获取候选人列表，远程调用system接口
     *
     * @Author xuyuxiang
     * @Date 2019/11/19 14:29
     **/
    List<UserInfo> getCandidateUser(Set<Long> candidateUserIdSet, Set<Long> candidateGroupIdSet);

    /**
     * 获取角色列表，远程调用system接口
     *
     * @Author xuyuxiang
     * @Date 2019/11/19 14:42
     **/
    List<WorkflowRoleInfo> getRoleList();

    /**
     * 获取角色下用户列表，远程调用system接口
     *
     * @Author xuyuxiang
     * @Date 2019/11/19 14:49
     **/
    Page<UserInfo> getUserListByRoleId(Long roleId);
}
